﻿#pragma once
#include <dp/config.h>
#include <windows.h>

#include <dp/sys/common.h>
#include <dp/thread/LockObject.h>

#include <iostream>

DP_BEGIN

// Có một vài thread đang bị block trong method Enter, nếu có 1 thread khác delete ciricalsection object thì điều gì sẽ xảy ra

// Khuyên: dùng ScopeLock thay vì gọi Lock và Unlock một cách trực tiếp.
class DP_DECL CriticalSection : public LockObject
{
	NO_COPY_OR_ASSIGN(CriticalSection)

public:
	CriticalSection(const char *name = 0);
	virtual void Lock();
	virtual bool TryLock();
	virtual void Unlock();
	virtual ~CriticalSection();

private:
	CRITICAL_SECTION criticalSection;
	int m_nLockCount;

public:
	const char *m_name;
};

DP_END
